package com.sinosoft.content;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import com.sinosoft.base.Constants;
import com.sinosoft.base.GenericDaoHibernate;
import com.sinosoft.util.CheckEmpty;
import com.sinosoft.util.DataTransUtil;
import com.sinosoft.util.DateTimeUtils;

@Repository
public class ContentDaoHibernate extends GenericDaoHibernate<Content, Long>
		implements ContentDao {

	public ContentDaoHibernate() {
		super(Content.class);
	}

	/**
	 * 新增或修改content
	 */
	public Content saveContent(Content con) {
		if (null == con.getContentId()) {

			byte[] aaa = con.getContent().getBytes();
			con.setContentClob(aaa);
			getHibernateTemplate().save(con);
			getHibernateTemplate().flush();
		} else {
			byte[] aaa = con.getContent().getBytes();
			con.setContentClob(aaa);

			con.setContent(DataTransUtil.encode(con.getContent()));
			getHibernateTemplate().merge(con);
		}
		return con;
	}

	/**
	 * 根据id获取content
	 */
	@SuppressWarnings("unchecked")
	public Content getContentById(Long conId) {
		List<Content> list = getHibernateTemplate().find(
				"from Content where contentId=?", conId);
		if (null != list && list.size() > 0) {
			Content cont = new Content();
			cont = list.get(0);
			String strResult = "";
			if (null != cont.getContentClob()) {
				strResult = new String(cont.getContentClob());//二进制转String
			}
			cont.setContent(strResult);
			
			
			return cont;
		}
		return null;
	}

	/**
	 * 获取所有Content
	 */
	@SuppressWarnings("unchecked")
	public List<Content> getAllContent() {
		return getHibernateTemplate().find("from Content ");
	}

	/**
	 * 删除Content
	 */
	public void removeContent(Content con) {
		getHibernateTemplate().delete(con);
	}

	// /**
	// * 根据条件查询新闻信息
	// */
	// @SuppressWarnings( { "unchecked", "null" })
	// public List<Content> getContentByType(ContentView vo) {
	//
	// // ArrayList<Content> conlist = null;
	// List alist = null;
	//
	// if (null == vo) {
	// return null;
	// }
	// Session session = null;
	// try {
	// session = getHibernateTemplate().getSessionFactory().openSession();
	//
	// StringBuffer sql = new StringBuffer();
	// sql.append("1=1");
	//
	// if (!CheckEmpty.isEmpty(vo.getContentTitle())) {
	// sql.append(" and t.contenttitle like '%" + vo.getContentTitle()
	// + "%'  ");
	// }
	// if (null != vo.getContentType() && vo.getContentType() > 0) {
	// sql.append(" and contentType =  " + vo.getContentType());
	// }
	// if (null != vo.getIsRelease() && vo.getIsRelease() > 0) {
	// sql.append(" and isRelease = " + vo.getIsRelease());
	// }
	// // if (!CheckEmpty.isEmpty(vo.getStartime())) {
	// // c.add(Restrictions.gt("contentTime", DateTimeUtils
	// // .StringToDate(vo.getStartime())));
	// // }
	// // if (!CheckEmpty.isEmpty(vo.getEndtime())) {
	// // c.add(Restrictions.lt("contentTime", DateTimeUtils
	// // .StringToDate(vo.getEndtime())));
	// // }
	// // if (Constants.ORDERY_ASC.equals(vo.getOrder())) {
	// // c.addOrder(Order.asc("contentTime"));
	// // } else {
	// // c.addOrder(Order.desc("contentTime"));
	// // }
	// // if (vo.getBegin() >= 0 && vo.getPageSize() > 0) {
	// // c.setFirstResult(vo.getBegin());
	// // c.setMaxResults(vo.getPageSize());
	// // }
	//
	// List list = session.createSQLQuery(
	// "select * from ZYWX_CONTENT where " + sql.toString())
	// .list();
	//
	// for (int i = 0; i < list.size(); i++) {
	// Object[] aa = (Object[]) list.get(i);
	// Content con = new Content();
	// if (null != aa[0]) {
	// con.setContentId(Long.valueOf(aa[0].toString()));
	// }
	// if (null != aa[4]) {
	// con.setContentTime(DateTimeUtils.StringToDate(aa[4]
	// .toString()));
	// }
	// if (null != aa[1]) {
	// con.setContentTitle(aa[1].toString());
	// }
	// if (null != aa[3]) {
	// con.setContentType(Long.valueOf(aa[3].toString()));
	// }
	// if (null != aa[2]) {
	// con.setIsRelease(Long.valueOf(aa[2].toString()));
	// }
	// if (null != aa[5]) {
	// con.setContent("11");
	// }
	// alist.add(con);
	// // conlist.add(con);
	// // [3389, 111, 1, 3, 2011-09-20 14:30:45.0,
	// // oracle.sql.BLOB@b0b978]
	// // System.out.println(aa[5]);
	// }
	//
	// // Criteria c = session.createCriteria(Content.class);
	// // if (!CheckEmpty.isEmpty(vo.getContentTitle())) {
	// // c.add(Restrictions.like("contentTitle", "%"
	// // + vo.getContentTitle() + "%"));
	// // }
	// // if (null != vo.getContentType() && vo.getContentType() > 0) {
	// // c.add(Restrictions.eq("contentType", vo.getContentType()));
	// // }
	// // if (null != vo.getIsRelease() && vo.getIsRelease() > 0) {
	// // c.add(Restrictions.eq("isRelease", vo.getIsRelease()));
	// // }
	// // if (!CheckEmpty.isEmpty(vo.getStartime())) {
	// // c.add(Restrictions.gt("contentTime", DateTimeUtils
	// // .StringToDate(vo.getStartime())));
	// // }
	// // if (!CheckEmpty.isEmpty(vo.getEndtime())) {
	// // c.add(Restrictions.lt("contentTime", DateTimeUtils
	// // .StringToDate(vo.getEndtime())));
	// // }
	// // if (Constants.ORDERY_ASC.equals(vo.getOrder())) {
	// // c.addOrder(Order.asc("contentTime"));
	// // } else {
	// // c.addOrder(Order.desc("contentTime"));
	// // }
	// // if (vo.getBegin() >= 0 && vo.getPageSize() > 0) {
	// // c.setFirstResult(vo.getBegin());
	// // c.setMaxResults(vo.getPageSize());
	// // }
	// //
	// // list = c.list();
	// } catch (Exception e) {
	// e.printStackTrace();
	// } finally {
	// session.close();
	// }
	// return alist;
	// }

	/**
	 * 根据条件查询新闻信息
	 */
	public List<Content> getContentByType(ContentView vo) {
		ArrayList<Content> list = null;
		if (null == vo) {
			return null;
		}
		Session session = null;
		try {
			session = getHibernateTemplate().getSessionFactory().openSession();
			Criteria c = session.createCriteria(Content.class);
			if (!CheckEmpty.isEmpty(vo.getContentTitle())) {
				c.add(Restrictions.like("contentTitle", "%"
						+ vo.getContentTitle() + "%"));
			}
			if (null != vo.getContentType() && vo.getContentType() > 0) {
				c.add(Restrictions.eq("contentType", vo.getContentType()));
			}
			if (null != vo.getIsRelease() && vo.getIsRelease() > 0) {
				c.add(Restrictions.eq("isRelease", vo.getIsRelease()));
			}
			if (!CheckEmpty.isEmpty(vo.getStartime())) {
				c.add(Restrictions.gt("contentTime", DateTimeUtils
						.StringToDate(vo.getStartime())));
			}
			if (!CheckEmpty.isEmpty(vo.getEndtime())) {
				c.add(Restrictions.lt("contentTime", DateTimeUtils
						.StringToDate(vo.getEndtime())));
			}
			if (Constants.ORDERY_ASC.equals(vo.getOrder())) {
				c.addOrder(Order.asc("contentTime"));
			} else {
				c.addOrder(Order.desc("contentTime"));
			}
			if (vo.getBegin() >= 0 && vo.getPageSize() > 0) {
				c.setFirstResult(vo.getBegin());
				c.setMaxResults(vo.getPageSize());
			}

			list = (ArrayList<Content>) c.list();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			session.close();
		}

		/**
		 * 将blob 转化到 普通字段中
		 */

		ArrayList<Content> conList = new ArrayList();

		for (int i = 0; i < list.size(); i++) {
			Content cont = new Content();
			cont = list.get(i);
			String strResult = "";
			if (null != cont.getContentClob()) {
				strResult = new String(cont.getContentClob());
			}
			cont.setContent(strResult);
			conList.add(cont);
		}

		return list;
	}

	public int getCountNum(String sql) {
		int result = 0;
		Session session = null;
		try {
			if (!CheckEmpty.isEmpty(sql)) {
				session = getHibernateTemplate().getSessionFactory()
						.openSession();
				Query query = session.createQuery(sql);
				result = Integer.parseInt(query.list().get(0).toString());
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			session.close();
		}
		return result;
	}
}
